﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using Model.Requisicoes;
using Model.Produtos;
using Model.Refeicoes;
using Model.Tipologias;
using SandTrap.WebControls;
using Services.Refeicoes;

namespace welwitschia.Requisicoes
{
    public partial class RequisicoesProdutos : PaginaBase
    {
        String _ultimoNomeGrupoProduto;

        protected void Page_Load(object sender, EventArgs e)
        {
            
            if (!Page.IsPostBack)
            {
                try
                {
                    hfDecimalSeparator.Value = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
                    if (String.IsNullOrEmpty(Request.QueryString["rcid"]) || String.IsNullOrEmpty(Request.QueryString["nr"]))
                        throw new Exception("Parâmetros inválidos para iniciar a página!");

                    hfIdRefeicaoContratada.Value = Request.QueryString["rcid"].ToString();
                    hfNumeroRequisicao.Value = Request.QueryString["nr"].ToString();
                    hfDataRefeicao.Value = Request.QueryString["dt"].ToString();
                    hfIdUnidade.Value = Request.QueryString["uid"].ToString();

                    IRequisicaoService requisicaoService = new RequisicaoService();
                    lvProdutos.DataSource =  requisicaoService.ObterlinhasTodosProdutosPorRequisicaoRefeicao(
                                                                            Convert.ToInt64(hfNumeroRequisicao.Value),
                                                                            Convert.ToInt64(hfIdRefeicaoContratada.Value));

                    lvProdutos.DataBind();

                    IList<RefeicaoUnidade> lRefeicaoUnidade = RefeicaoService.ObterRefeicaoUnidadeContratadas(
                                          Convert.ToInt64(hfIdRefeicaoContratada.Value),
                                          DateTime.ParseExact(hfDataRefeicao.Value, "yyyyMMdd", null));
                    Decimal valorTotal = 0;
                    Decimal qtTotal = 0;
                    foreach (RefeicaoUnidade refeicaoUnidade in lRefeicaoUnidade)
                    {
                        valorTotal += refeicaoUnidade.RefeicoesPrevistas.Value * refeicaoUnidade.PrecoRefeicao;
                        qtTotal += refeicaoUnidade.RefeicoesPrevistas.Value;
                    }

                    nbProveitos.Amount = valorTotal;
                    lblTotProvVal.Text = valorTotal.ToString();
                    lblPrevRefeicoesVal.Text = qtTotal.ToString();

                    Refeicao refeicao = RefeicaoService.ObterRefeicao(Convert.ToInt64(hfIdRefeicaoContratada.Value),
                                                                      DateTime.ParseExact(hfDataRefeicao.Value, "yyyyMMdd", null));
                    if (refeicao != null)
                    {
                        nbRacio.Amount = refeicao.RacioMateriasPrimasPrevisto;
                        lblTotRacVal.Text = refeicao.RacioMateriasPrimasPrevisto.ToString();
                        nbCusto.Amount = refeicao.TotalCustosPrevisto;
                        lblTotCostVal.Text = refeicao.TotalCustosPrevisto.ToString();
                    }

                    IList<RefeicaoOpcao> lRefeicaoOpcao = RefeicaoService.ObterListaRefeicaoOpcao(
                                                              Convert.ToInt64(hfIdRefeicaoContratada.Value),
                                                              DateTime.ParseExact(hfDataRefeicao.Value, "yyyyMMdd", null));

                    ListView1.DataSource = lRefeicaoOpcao;
                    ListView1.DataBind();
                }
                catch (Exception ex)
                {
                    MostraErro(ex.Message);
                }
            }
        }

        
        protected String AddGroupingRowIfSupplierHasChanged()
        {
            //Get the data field value of interest for this row
            String nomeGrupoProduto = Eval("Produto.GrupoProduto.Nome").ToString();

            //Specify name to display if dataFieldValue is a database NULL
            if (nomeGrupoProduto.Length == 0)
            {
                nomeGrupoProduto = "Desconhecido";
            }

            //See if there's been a change in value
            if (_ultimoNomeGrupoProduto != nomeGrupoProduto)
            {
                //There's been a change! Record the change and emit the table row
                _ultimoNomeGrupoProduto = nomeGrupoProduto;

                return String.Format("<tr class=\"gsubhdr2\"><td colspan=\"6\">Família: {0}</td></tr>", nomeGrupoProduto);
            }
            else
            {
                //Sem alteração, retorna uma string vazia
                return String.Empty;
            }
        }

        protected void btnConfirmar_Click(object sender, EventArgs e)
        {
            try
            {

                IRequisicaoService requisicaoService = new RequisicaoService();
                Requisicao requisicao = requisicaoService.ObterPorNumeroRequisicao(Convert.ToInt64(hfNumeroRequisicao.Value));

                LinhaRequisicao linha = null;
                NumberBox txtQt = null;
                Label lblIdProduto = null;
                Label lblNomeProduto = null;
                Label lblPreco = null;
                Label lblTotalCusto = null;
                HiddenField hfCodUnidadeMedida = null;
                HiddenField hfQtOriginal = null;
                Decimal custoTotal = 0;
                for (Int32 i = 0; i < lvProdutos.Items.Count; i++)
                {
                    txtQt = (NumberBox)lvProdutos.Items[i].Controls[1].FindControl("txtQt");
                    lblTotalCusto = (Label)lvProdutos.Items[i].Controls[1].FindControl("subtotal");
                    hfQtOriginal = (HiddenField)lvProdutos.Items[i].Controls[1].FindControl("hfQtOriginal");
                    if ((txtQt.Amount.HasValue && txtQt.Amount.Value>0) 
                                                        || Convert.ToDecimal(hfQtOriginal.Value) > 0)
                    {
                        lblIdProduto = (Label)lvProdutos.Items[i].Controls[1].FindControl("lblIdProduto");
                        lblNomeProduto = (Label)lvProdutos.Items[i].Controls[1].FindControl("lblNomeProduto");
                        lblPreco = (Label)lvProdutos.Items[i].Controls[1].FindControl("lblPreco");
                        hfCodUnidadeMedida = (HiddenField)lvProdutos.Items[i].Controls[1].FindControl("hfCodUnidadeMedida");
                       
                        linha = new LinhaRequisicao();
                        linha.Produto = new Produto() { IdProduto = Convert.ToInt64(lblIdProduto.Text) };
                        linha.IdRefeicaoContratada = Convert.ToInt64(hfIdRefeicaoContratada.Value);
                        linha.Requisicao = requisicao;
                        if (txtQt.Amount.HasValue)
                            linha.Quantidade = txtQt.Amount.Value;
                        linha.NomeProduto = lblNomeProduto.Text;
                        linha.DescricaoProduto = String.Empty;
                        linha.UnidadeMedida = new Tipologia() { Codigo = hfCodUnidadeMedida.Value };
                        linha.PrecoCusto = Convert.ToDecimal(lblPreco.Text);
                        linha.TotalCusto = linha.PrecoCusto * linha.Quantidade;

                        if (Convert.ToDecimal(hfQtOriginal.Value) > 0 && linha.Quantidade == 0)
                        {
                            requisicaoService.Apaga(linha);
                        }
                        else
                        {
                            custoTotal += linha.PrecoCusto * linha.Quantidade;
                            if (String.IsNullOrEmpty(hfQtOriginal.Value) || Convert.ToDecimal(hfQtOriginal.Value) == 0)
                                requisicaoService.Insere(linha);
                            else if (Convert.ToDecimal(hfQtOriginal.Value) != linha.Quantidade)
                                requisicaoService.Actualiza(linha);
                        }
                    }
                   
                }

                Refeicao refeicao = RefeicaoService.ObterRefeicao(Convert.ToInt64(hfIdRefeicaoContratada.Value),
                                                                     DateTime.ParseExact(hfDataRefeicao.Value, "yyyyMMdd", null));
                refeicao.TotalCustosPrevisto = custoTotal;
                
                if (refeicao.TotalVendasPrevisto.HasValue && refeicao.TotalVendasPrevisto.Value > 0)
                    refeicao.RacioMateriasPrimasPrevisto = custoTotal / refeicao.TotalVendasPrevisto.Value;
                else 
                    refeicao.RacioMateriasPrimasPrevisto = 0;
                
                refeicao.CodEstadoRefeicao = "cmp";
                RefeicaoService.Actualiza(refeicao);


                Response.Redirect(String.Format("~\\Requisicoes\\RequisicaoDetalhe.aspx?uid={0}&dt={1}",
                    hfIdUnidade.Value, hfDataRefeicao.Value));

            }
            catch (Exception ex)
            {
                MostraErro(ex.Message);
            }

        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect(String.Format("~\\Requisicoes\\RequisicaoOpcoes.aspx?rcid={0}&dt={1}&nr={2}",
                  hfIdRefeicaoContratada.Value, hfDataRefeicao.Value, hfNumeroRequisicao.Value));
        }

       
    }
}